(**

   La validité d'un écart est quelque chose de difficile. Les bouts et
   les rois ne peuvent pas  faire partie de l'écart, quant aux atouts,
   ils le  peuvent, à condition  qu'aucune autre carte ne  puisse être
   écartée. Cela implique également de montrer cette carte à tous.
   
   @author Vivien Kraus

*)

(**

   Cette signature correspond exactement au module {!Carte}. Le module
   entier a été écrit sous forme d'un foncteur, comme pour {!Appel}, à
   des fins pédagogiques.

*)
module type TCarte =
  sig
    type carte

    (**
       
       Les  fonctions les  plus utiles  sur une  carte sont  les trois
       suivantes dans le cas d'un écart.

    *)

    val est_atout: carte -> bool
    val est_roi: carte -> bool
    val est_bout: carte -> bool
  end

(**

   Appelé sur le module {!Carte}, en général.

*)
module Make :
  functor (Carte: TCarte) ->
	  sig

	    (** 

		La structure d'écart représente une généralisation des
		cas suivants :

		{ul 
		{- Je n'ai pas le droit d'écarter des atouts car j'ai 
		au moins trois cartes que je peux écarter. Je dois
		donc en choisir trois parmi les cartes écartables 
		de mon jeu.} 
		{- Il ne me reste que zéro, une ou deux cartes qui ne 
		soient ni un bout, ni un roi, ni un atout. Je dois 
		donc écarter obligatoirement ces quelques cartes 
		possibles, et compléter avec un certain nombre de 
		cartes parmi mes atouts.}} 

	    *) 
	    type structure = 
	      | Parmi of (int * (Carte.carte list)) 
	      | ToutesEt of (Carte.carte list) * structure 

	    (**

	       Déduit  la structure  des écarts  que je  peux  faire à
	       partir de mon jeu.

	    *)
	    val structure_ecart: Carte.carte list -> structure  

	    (**
	       
	       [respecte_structure ecart s]  retourne vrai ssi l'écart
	       [ecart]  respecte la  structure [s].  L'avantage  de ce
	       calcul est  qu'il est immédiat et  indépendant de votre
	       jeu.

	    *)
	    val respecte_structure: Carte.carte list -> structure -> bool 
	  end
